package tt.dz.appserver.util.jdbc;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.List;

import org.apache.commons.lang3.StringUtils;

import tt.dz.appserver.util.ReflectUtils;
import tt.dz.appserver.util.annotation.AnnotationUtils;

/**
 * JDBC帮助
 * @author 谢龙飞
 * @date 2015年12月22日
 */
@SuppressWarnings("unchecked")
public final class JdbcUtils {
	
	/**
	 * 设置值
	 * 
	 * @author Administrator
	 * @param rs
	 * @param cls
	 * @param fields
	 * @return
	 */
	public final static <T> T setColumn(ResultSet rs,Class<T> cls,Field[] fields) {
		
		Object obj = null;
		try {
			obj = cls.newInstance();
			for (Field field : fields) {
				if (!ReflectUtils.judgeModifiersAvailable(field)) {

					// 得到属性类型
					// 得到属性名称
					String fieldName = field.getName();

					// 从jdbc中得到属性的值
					ResultSetMetaData resultSetMetaData = rs.getMetaData();
					//title个数
					int columnCount = resultSetMetaData.getColumnCount();
					
					for (int i = 0; i < columnCount; i++) {
						
						//判断实体中是否含此列
						if (resultSetMetaData.getColumnName(i + 1).equalsIgnoreCase(fieldName)) {
							//获取值
							Object fieldObj = rs.getObject(fieldName);
							
							// 设置反射不安全检查
							field.setAccessible(true);
							Class<?> typeName = field.getType();
							// 判断类型并调用set方法
							if (typeName.equals(Integer.class)) {
								field.set(obj, (Integer)fieldObj);
							} else if (typeName.equals(Double.class)) {
								field.set(obj, (Double)fieldObj);
							} else if (typeName.equals(String.class)) {
								field.set(obj, (String)fieldObj);
							} else if (typeName.equals(Short.class)) {
								field.set(obj, (Short)fieldObj);
							} else if (typeName.equals(Float.class)) {
								if(fieldObj!=null){
									field.set(obj, ((BigDecimal)fieldObj).floatValue());
								}
							} else if (typeName.equals(Double.class)) {
								if(fieldObj!=null){
									field.set(obj, ((BigDecimal)fieldObj).floatValue());
								}
							}
							else{
								field.set(obj, fieldObj);
							}
							break;
						}
					}
				}
			}
		} catch (InstantiationException | IllegalAccessException | SecurityException | IllegalArgumentException | SQLException e) {
			e.printStackTrace();
		}
		return (T) obj;
	}
	
	/**
	 * 生成查询sql
	 * @param obj
	 * @param fields
	 * @param cls
	 * @param sortName
	 * @param sortVal
	 * @param pageNo
	 * @param pageSize
	 * @param queryParamList
	 * @return
	 */
	public static final String generateSql(Object obj, Field[] fields, Class<?> cls, String sortName, 
			Integer sortVal, Integer pageNo, Integer pageSize, List<Object> queryParamList){

		//拼接str
		StringBuffer buffer;
		
		//获取表名称
		String tableName = AnnotationUtils.getEntityTableMappingByAnnotationName(cls);
		
		buffer = new StringBuffer("SELECT ");
		buffer.append(ReflectUtils.setQueryColumn(fields, tableName));
		buffer.append(" FROM ");
		buffer.append(tableName);
		
		//是否首次追加条件
		boolean firstAppend = true;
		try {
			//循环属性追加条件
			for (Field field : fields) {
				//判断是否含有不可用修饰符,是否为忽略映射属性
				if(!ReflectUtils.judgeModifiersAvailable(field) && !AnnotationUtils.ignore(field)){
					
					//改为直接获取
					field.setAccessible(true);
					Object resultObj = field.get(obj);
					
					if(resultObj!=null){
						
						//首次追加where条件
						if(firstAppend){
							firstAppend = false;
							buffer.append(" WHERE ");
						}
						else{
							buffer.append(" AND ");
						}
						buffer.append(field.getName());
						buffer.append('=');
						buffer.append('?');
						//将参数值顺序保存至list
						queryParamList.add(resultObj);
					}
				}
			}
		} catch (SecurityException | IllegalArgumentException | IllegalAccessException e) {
			e.printStackTrace();
		}
		//排序匹配
		if(StringUtils.isNotEmpty(sortName)){
			buffer.append(" ORDER BY ");
			//tableName（主表）表的排序条件
			buffer.append(sortName);
			if(sortVal==1){
				buffer.append(" ASC");
			}
			else{
				buffer.append(" DESC");
			}
		}
		//分页查询匹配
		if(pageNo!=null && pageSize!=null && pageSize.intValue()!=0){
			buffer.append(" LIMIT ");
			buffer.append((pageNo-1)*pageSize);
			buffer.append(',');
			buffer.append(pageSize);
		}
		return buffer.toString();
	}
}
